#!/usr/bin/env node
/***
 * 直接运行 node gitPush.js 推送代码到gitee 或者 github
 */
const program = require('./_commander@8.3.0/index.js');
const packageJson = require('./package');

const { showhelp } = require('./showhelp')
showhelp(__filename, __dirname, packageJson);

program
    .version(packageJson.version, '-v, --version', '版本号')
    .option('-m, --comment <comment>', '提交注释', new Date().format('yyyy-MM-dd hh:mm:ss'))
    .option('-a, --add', '添加到本地缓存', false)
    .option('-s, --status', '只查看status', false)
    .option('-p, --push [branch]', 'push提交到远程', false)
    .option('-o, --one-push [branch]', 'push一次同git push', false)
    .parse(process.argv);

const { exec } = require('child_process');
let commentArg = process.argv.slice(2)[0];
let options = program.opts();
console.log(options,'option');
/**
 * 检查参数是否正确
 */
function checkAgr() {
    // 检查 -m
    // if(options.comment && options.comment===true) {
    //     throw new Error("请输入git-push -m 后面的参数值")
    // }
    // 
}

if (commentArg == '/?' || !commentArg) {
    console.log(`
        只能这样使用
        git-push 查看帮助
        git-push -s 查看状态
        git-push -a 添加到本地缓存
        git-push -p 或者 git-push -p -m "" 一键从add到push推送到远程
        git-push -o 同等 git push命令
        git-push -p "分支名" 默认为master
        git-push -o "分支名" 默认为master
        //git命令
        git config --global http.proxy          查看代理
        git config --global --unset http.proxy  取消代理
    `)
    return
} else {
    checkAgr();
    run();
}

function run() {
    if(options.onePush) {
        push();
        return
    }
    status().then((file) => {
        add(file).then(() => {
            commit().then(() => {
                push();
            })
        })
    })
}

// status
function status() {
    return new Promise((resolve, reject) => {
        exec('git status', { shell: process.platform === 'win32' }, (error, stdout, stderr) => {
            if (error) {
                console.error(`执行出错: ${error}`);
                return;
            }
            console.log("当前目录：", process.cwd())
            console.log('status： ok', stdout)
            if (options.status) {
                return
            }
            let result = stdout;
            // 只取修改了的和增加的文件，字符串分割
            if (stdout.includes('Changes not staged for commit:')) {
                result = stdout.split('Changes not staged for commit:')[1];
            }
            //   console.log(`stdout: ${stdout}`);
            let fileList = result.match(/\t+.+[\n]/g)?.map((item) => {
                // 八进制转中文
                item = Octal2Chinese(item);
                item = item.replace('modified:', '');
                item = item.replace('deleted:', '');
                console.log(Octal2Chinese(item))
                // item = item.replace(/["]/g,'');
                return item.replace(/(\s)/g, '');
            }).filter((item) => {
                // 排除 vscode svn git文件夹
                return !item.includes('.svn/') && !item.includes('.git/') && !item.includes('.vscode/') && !item.includes('node_modules') && !item.includes('newfile:') && !item.includes('.hbuilderx')
            });
            let file = fileList?.join(' ');
            console.log("添加的文件：", `git add ${file}`)
            if (!file) return
            if (stderr) {
                console.error(`status stderr: ${stderr}`);
            }
            resolve(file);
        });
    })
}
// add
function add(file) {
    return new Promise((resolve, reject) => {
        exec(`git add ${file}`, { shell: process.platform === 'win32' }, (error, stdout, stderr) => {
            if (error) {
                console.error(`执行出错: ${error}`);
                return;
            }
            console.log('添加成功 stdout：', stdout)
            if (options.add) {
                return
            }
            if (stderr) {
                console.error(`add stderr： ${stderr}`);
            }
            resolve()
        })
    })

}
// commit
function commit() {
    return new Promise((resolve, reject) => {
        exec(`git commit -m "${options.comment}"`, (error, stdout, stderr) => {
            if (error) {
                console.error(`执行出错： ${error}`);
                return;
            }
            console.log(`git commit -m "${options.comment}"`)
            console.log('commit成功 stdout：', stdout)
            if (stderr) {
                console.error(`commit stderr： ${stderr}`);
            }
            resolve();
        });
    })

}
// 防止 push 失败
function push() {
    let result = options.push || options.onePush || false;
    if(!result) {
        throw new Error("请输入正确的参数 -p 或 -o");
    }
    if(result && typeof result!=='string') {
        // 默认 master[branch]为空
        result = 'master';
    }
    let pushCmd = `git push -u origin ${result}`;
    exec(pushCmd, (error, stdout, stderr) => {
        if (error) {
            console.error(`执行出错： ${error}`);
            push();//递归
            return;
        }
        console.log('push成功 stdout：', stdout);
        if (stderr) {
            console.error(`push stderr： ${stderr}`);
        }
    });
}

// 八进制转 中文
function Octal2Chinese(str) {
    const matches = str.match(/(\\\d{3}){3}/g);
    if (matches) matches.forEach(match => {
        let encoded = '';
        const splits = match.split('\\');
        splits.forEach(code => !code || (encoded += '%' + parseInt(code, 8).toString(16)));
        const cChar = decodeURI(encoded);
        str = str.replace(match, cChar);
    });
    return str;
}
